home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1999 #2 / Amiga Plus CD - 1999 - No. 2.iso / System-Boost / Workbench / ToolManager / Source / Library / handle.c < prev    next >
C/C++ Source or Header  |  1998-06-17  |  4KB  |  177 lines

  1. /*
  2.  * handle.c  V3.1
  3.  *
  4.  * TMHandle management routines
  5.  *
  6.  * Copyright (C) 1990-98 Stefan Becker
  7.  *
  8.  * This source code is for educational purposes only. You may study it
  9.  * and copy ideas or algorithms from it for your own projects. It is
  10.  * not allowed to use any of the source codes (in full or in parts)
  11.  * in other programs. Especially it is not allowed to create variants
  12.  * of ToolManager or ToolManager-like programs from this source code.
  13.  *
  14.  */
  15.  
  16. #include "toolmanager.h"
  17.  
  18. /* Local data */
  19. static struct MinList HandleList;
  20.  
  21. /* Initialize handle management */
  22. void InitHandles(void)
  23. {
  24.  /* Initialize handle list */
  25.  NewList((struct List *) &HandleList);
  26. }
  27.  
  28. /* Get handle list */
  29. struct MinList *GetHandleList(void)
  30. {
  31.  return(&HandleList);
  32. }
  33.  
  34. /* Initialize a ToolManager handle */
  35. #define DEBUGFUNCTION InitToolManagerHandle
  36. BOOL InitToolManagerHandle(struct TMHandle *tmh)
  37. {
  38.  int i;
  39.  
  40.  TMHANDLE_LOG(LOG1(Handle, "0x%08lx", tmh))
  41.  
  42.  /* Set ID counter to 0 */
  43.  tmh->tmh_IDCounter = 0;
  44.  
  45.  /* For all list structures */
  46.  for (i = 0; i < TMOBJTYPES; i++)
  47.  
  48.   /* Init list structure */
  49.   NewList((struct List *) &tmh->tmh_ObjectLists[i]);
  50.  
  51.  /* Append handle to list */
  52.  AddTail((struct List *) &HandleList, (struct Node *) &tmh->tmh_Node);
  53.  
  54.  return(TRUE);
  55. }
  56.  
  57. /* Shut down a ToolManager handle */
  58. #undef  DEBUGFUNCTION
  59. #define DEBUGFUNCTION DeleteToolManagerHandle
  60. void DeleteToolManagerHandle(struct TMHandle *tmh)
  61. {
  62.  int i;
  63.  
  64.  TMHANDLE_LOG(LOG1(Handle, "0x%08lx", tmh))
  65.  
  66.  /* Remove handle from list */
  67.  Remove((struct Node *) &tmh->tmh_Node);
  68.  
  69.  /* Remove objects from lists */
  70.  for (i = TMOBJTYPES - 1; i >= 0; i--) {
  71.   Object *obj1 = (Object *) tmh->tmh_ObjectLists[i].mlh_Head;
  72.   Object *obj2;
  73.  
  74.   TMHANDLE_LOG(LOG2(List, "Type %ld Head 0x%08lx", i, obj1))
  75.  
  76.   /* Scan object list and delete objects */
  77.   while (obj2 = NextObject(&obj1)) DisposeObject(obj2);
  78.  }
  79.  
  80.  TMHANDLE_LOG(LOG0(Deleted))
  81. }
  82.  
  83. /* Create a new ToolManager object */
  84. #undef  DEBUGFUNCTION
  85. #define DEBUGFUNCTION CreateToolManagerObject
  86. Object *CreateToolManagerObject(struct TMHandle *tmh, ULONG type)
  87. {
  88.  Object *rc;
  89.  
  90.  TMHANDLE_LOG(LOG2(Arguments, "Handle 0x%08lx Type %ld", tmh, type))
  91.  
  92.  rc = NewObject(ToolManagerClasses[type], NULL, TMA_ObjectType, type,
  93.                                                 TMA_TMHandle,   tmh,
  94.                                                 TAG_DONE);
  95.  
  96.  TMHANDLE_LOG(LOG1(Result, "0x%08lx", rc))
  97.  
  98.  return(rc);
  99. }
  100.  
  101. /* Find a named ToolManager object in the specified list */
  102. #undef  DEBUGFUNCTION
  103. #define DEBUGFUNCTION FindTypedNamedTMObject
  104. Object *FindTypedNamedTMObject(struct TMHandle *tmh, const char *name,
  105.                                ULONG type)
  106. {
  107.  Object *obj = (Object *) tmh->tmh_ObjectLists[type].mlh_Head;
  108.  Object *rc;
  109.  
  110.  TMHANDLE_LOG(LOG4(Arguments, "Handle 0x%08lx Name '%s' (0x%08lx) Type %ld",
  111.                    tmh, name, name, type))
  112.  
  113.  /* Scan object list */
  114.  while (rc = NextObject(&obj)) {
  115.   const char *s;
  116.  
  117.   /* Get name of object */
  118.   GetAttr(TMA_ObjectName, rc, (ULONG *) &s);
  119.  
  120.   /* Object found? --> Leave loop */
  121.   if (strcmp(name, s) == 0) break;
  122.  }
  123.  
  124.  TMHANDLE_LOG(LOG1(Result, "0x%08lx", rc))
  125.  
  126.  return(rc);
  127. }
  128.  
  129. /* Find a named ToolManager object in the handle */
  130. #undef  DEBUGFUNCTION
  131. #define DEBUGFUNCTION FindNamedTMObject
  132. Object *FindNamedTMObject(struct TMHandle *tmh, const char *name)
  133. {
  134.  int     i;
  135.  Object *rc;
  136.  
  137.  TMHANDLE_LOG(LOG3(Arguments, "Handle 0x%08lx Name '%s' (0x%08lx) Type %ld",
  138.                    tmh, name, name))
  139.  
  140.  /* For all object lists */
  141.  for (i = 0; i < TMOBJTYPES; i++)
  142.  
  143.   /* Object with this type found? --> Leave loop */
  144.   if (rc = FindTypedNamedTMObject(tmh, name, i)) break;
  145.  
  146.  TMHANDLE_LOG(LOG1(Result, "0x%08lx", rc))
  147.  
  148.  return(rc);
  149. }
  150.  
  151. /* Find a ToolManager object with this ID in the specified list */
  152. #undef  DEBUGFUNCTION
  153. #define DEBUGFUNCTION FindTypedIDTMObject
  154. Object *FindTypedIDTMObject(struct TMHandle *tmh, ULONG id, ULONG type)
  155. {
  156.  Object *obj = (Object *) tmh->tmh_ObjectLists[type].mlh_Head;
  157.  Object *rc;
  158.  
  159.  TMHANDLE_LOG(LOG3(Arguments, "Handle 0x%08lx ID 0x%08lx Type %ld",
  160.                    tmh, id, type))
  161.  
  162.  /* Scan object list */
  163.  while (rc = NextObject(&obj)) {
  164.   ULONG tmp;
  165.  
  166.   /* Get ID of object */
  167.   GetAttr(TMA_ObjectID, rc, &tmp);
  168.  
  169.   /* Object found? --> Leave loop */
  170.   if (tmp == id) break;
  171.  }
  172.  
  173.  TMHANDLE_LOG(LOG1(Result, "0x%08lx", rc))
  174.  
  175.  return(rc);
  176. }
  177.